<?php
/**
 * 校验器抽象类
 *
 * @package util.validator
 * @since 0.2
 */
abstract class IAbstractValidator implements IValidator {
	private $messages = array();
	
	/**
	 * 取得校验器提示的信息
	 *
	 * 目前只有校验不通过，才会产生信息
	 * 
	 * @return array
	 * @since 0.2
	 */
	public function getMessages() {
		return $this->messages;
	}
	
	/**
	 * 根据代码取得信息内容
	 *
	 * @param string $code 信息代码
	 * @return string
	 * @since 0.2
	 */
	public function getMessage($code) {
		if (array_key_exists($code, $this->messages)) {
			return $this->messages[$code];
		}
		return null;
	}
	
	/**
	 * 添加信息
	 *
	 * @param string $code 信息代码
	 * @param string $message 信息内容
	 * @since 0.2
	 */
	protected function addMessage($code, $message) {
		$this->messages[$code] = $message;
	}
	
	/**
	 * 将当前校验器添加到工厂类中
	 *
	 * @since 0.2
	 */
	protected function addToFactory() {
		IValidatorFactory::getInstance()->addValidator($this);
	}
	
	/**
	 * 检查值是否合适
	 *
	 * @param mixed $value 需要检查的值
	 * @param array $params 校验器参数
	 * @since 0.2
	 */
	public function isValid($value, array $params = null) {
		$this->setParams($params);
		$this->validate($value);
	}
	
	/**
	 * 执行校验
	 *
	 * @param mixed $value 需要校验的值
	 * @since 0.2
	 */
	abstract protected function validate($value);
	
	/**
	 * 设置参数
	 * 
	 * 通过此参数可以设定校验的方式
	 *
	 * @param array $params 参数
	 * @since 0.2
	 */
	private function setParams($params) {
		if (is_array($params)) {
			$vars = get_object_vars($this);
			foreach ($params as $key=>$param) {
				if (array_key_exists($key, $vars)) {
					$this->$key = $param;
				}
			}
		}
	}
}

?>